#include<bits/stdc++.h>
#define int long long
#define rep(i,a,b) for(int i(a);i<=(b);++i)
#define req(i,a,b) for(int i(a);i>=(b);--i)
#define sort stable_sort
using namespace std;
char buf[1<<23],*p1=buf,*p2=buf;
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<23,stdin),p1==p2)?EOF:*p1++)
template<typename TP> inline TP read(TP &num)
{
	TP x=0;
	int f=0;
	char ch=getchar();
	while(ch<48||ch>57) f|=ch=='-',ch=getchar();
	while(48<=ch&&ch<=57) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
	return num=f?-x:x;
}
template<typename ...Args> inline void read(Args &...args)
{
	(read(args),...);
}
template<typename TP> inline void write(TP x)
{
	(x<0)?(putchar('-'),x=-x):0;
	(x>9)?(write(x/10),0):0;
	putchar((x%10)^48);
}
template<typename TP> inline void writeln(TP x)
{
	write<TP>(x);
	puts("");
}
constexpr int mod=998'244'353;
int fac[3000001],ifac[3000001];
signed main()
{
	freopen("sequence.in","r",stdin);
	freopen("sequence.out","w",stdout);
	auto qpow=[&](int x,int y)->int
	{
		int res=1;
		while(y)
		{
			if(y&1) res=res*x%mod;
			x=x*x%mod,y>>=1;
		}
		return res;
	};
	fac[0]=1; rep(i,1,3000000) fac[i]=fac[i-1]*i%mod;
	ifac[3000000]=qpow(fac[3000000],mod-2);
	req(i,2999999,0) ifac[i]=ifac[i+1]*(i+1)%mod;
	auto binom=[&](int x,int y)->int{return fac[x]*ifac[y]%mod*ifac[x-y]%mod;};
	int n,m,q,k; read(n,m,q,k);
	int ans=0,invn=qpow(n,mod-2);
	rep(i,0,m) ans=(ans+(i&1?mod-1:1)*binom(m,i)%mod*qpow((mod+1-i*invn%mod)%mod,q)%mod)%mod;
	writeln((ans*qpow(qpow(k,m),mod-2)%mod*qpow(n*k%mod,q)%mod*max(0ll,n-m+1)%mod+mod)%mod);
	return 0;
}
